(defglobal ?*vector* = (new java.util.Vector))

;;   ********************
;;   * Tabla estudiante *
;;   ********************

(deftemplate estudiante
(slot tipoEmpresa(type SYMBOL)(allowed-values nacional multinacional nacional-multinacional))
(slot salario(type SYMBOL)(allowed-values bajo medio alto ))
(slot contrato(type SYMBOL)(allowed-values beca parcial completa )) )



(deffunction dame_nombre ()
(assert (estudiante)))


(defrule imprimeResultado
    (fin fin1)
?A<-(estudiante
         (tipoEmpresa ?emp)
         (salario ?sal)
         (contrato ?icon)
        )
    =>
(retract ?A)
)



(defrule regla1
     (and(edad joven)
     (curso estudiante))
=>
    (assert (tipoTrabajador EstMedio))
 )

(defrule regla2
     (and(or(edad media)(edad avanzada))
      (curso estudiante))
=>
    (assert (tipoTrabajador EstBajo))
)



(defrule regla3
     (curso acabado)
=>
    (assert (tipoTrabajador UniversBajo))
)

(defrule regla4
     (and(edad joven)
     (curso postgrado))
=>
    (assert (tipoTrabajador UniversAlto))
)



(defrule regla5
    (and(or(edad media)(edad avanzada))
     (curso postgrado))
=>
    (assert (tipoTrabajador UniversMedio)))

(defrule regla6
    (and(or(tipoTrabajador EstBajo)(tipoTrabajador EstMedio))(tipoExp Poca))
=>
    (assert (tipoCS c1)))

(defrule regla7
    (and(tipoTrabajador UniversBajo)(tipoExp Poca))
=>
    (assert (tipoCS c2))
    (printout t "Regla 7 "))

(defrule regla8
    (and(or(tipoTrabajador EstBajo)(tipoTrabajador EstMedio))(tipoExp Media))
=>
    (assert (tipoCS c3))
    (printout t "Regla 8 "))

(defrule regla9
    (and(tipoTrabajador UniversBajo)(tipoExp Media))
=>
    (assert (tipoCS c4)))

(defrule regla10
    (or
    (and(or(tipoTrabajador EstBajo)(tipoTrabajador EstMedio))(tipoExp Alta))
     (and(or(tipoTrabajador UniversAlto)(tipoTrabajador UniversMedio))(or(tipoExp Poca)(tipoExp Media)))
     )
=>
    (assert (tipoCS c5)))

(defrule regla11
    (and(tipoTrabajador UniversBajo)(tipoExp Alta))
=>
    (assert (tipoCS c6)))

(defrule regla12
    (and(or(tipoTrabajador UniversAlto)(tipoTrabajador UniversMedio))(tipoExp Alta))
=>
    (assert (tipoCS c7)))

(defrule regla13
    ?A<-(estudiante)
    (and(or(idiomas ninguno)(idiomas medio))(tipoCS c1))
=>
    (modify ?A (tipoEmpresa nacional)(contrato beca)(salario bajo))
    (call ?*vector* addElement ?A)
    (assert (fin fin1)))

(defrule regla14
    ?A<-(estudiante)
    (and(idiomas alto)(tipoCS c1))
=>
    (modify ?A (tipoEmpresa nacional-multinacional)(contrato beca)(salario bajo))
    (call ?*vector* addElement ?A)
    (assert (fin fin1)))

(defrule regla15
    ?A<-(estudiante)
    (and(or(idiomas ninguno)(idiomas medio))(tipoCS c2))
=>
    (modify ?A (tipoEmpresa nacional)(contrato completa)(salario bajo))
    (call ?*vector* addElement ?A)
    (assert (fin fin1)))

(defrule regla16
    ?A<-(estudiante)
    (and(idiomas alto)(tipoCS c2))
=>
    (modify ?A (tipoEmpresa nacional-multinacional)(contrato completa)(salario medio))
    (call ?*vector* addElement ?A)
    (assert (fin fin1)))

(defrule regla17
    ?A<-(estudiante)
    (and(or(idiomas ninguno)(idiomas medio))(tipoCS c3))
=>
    (modify ?A (tipoEmpresa nacional)(contrato parcial)(salario bajo))
    (call ?*vector* addElement ?A)
    (assert (fin fin1)))

(defrule regla18
    ?A<-(estudiante)
    (and(idiomas alto)(tipoCS c3))
=>
    (modify ?A (tipoEmpresa multinacional)(contrato parcial)(salario medio))
    (call ?*vector* addElement ?A)
    (assert (fin fin1)))

(defrule regla19
    ?A<-(estudiante)
    (and(idiomas ninguno)(tipoCS c4))
=>
    (modify ?A (tipoEmpresa nacional)(contrato completa)(salario medio))
    (call ?*vector* addElement ?A)
    (assert (fin fin1)))

(defrule regla20
    ?A<-(estudiante)
    (and(or(idiomas alto)(idiomas medio))(tipoCS c4))
=>
    (modify ?A (tipoEmpresa multinacional)(contrato completa)(salario medio))
    (call ?*vector* addElement ?A)
    (assert (fin fin1)))

(defrule regla21
    ?A<-(estudiante)
    (and(or(idiomas ninguno)(idiomas medio))(tipoCS c5))
=>
    (modify ?A (tipoEmpresa nacional)(contrato parcial)(salario medio))
    (call ?*vector* addElement ?A)
    (assert (fin fin1)))

(defrule regla22
    ?A<-(estudiante)
    (and(idiomas alto)(tipoCS c5))
=>
    (modify ?A (tipoEmpresa nacional-multinacional)(contrato parcial)(salario alto))
    (call ?*vector* addElement ?A)
    (assert (fin fin1)))

(defrule regla23
    ?A<-(estudiante)
    (and(idiomas ninguno)(tipoCS c6))
=>
    (modify ?A (tipoEmpresa nacional)(contrato completa)(salario alto))
    (call ?*vector* addElement ?A)
    (assert (fin fin1)))

(defrule regla24
    ?A<-(estudiante)
    (and(or(idiomas alto)(idiomas medio))(tipoCS c6))
=>
    (modify ?A (tipoEmpresa nacional-multinacional)(contrato completa)(salario alto))
    (call ?*vector* addElement ?A)
    (assert (fin fin1)))

(defrule regla25
    ?A<-(estudiante)
    (and(idiomas ninguno)(tipoCS c7))
=>
    (modify ?A (tipoEmpresa nacional)(contrato parcial)(salario alto))
    (call ?*vector* addElement ?A)
    (assert (fin fin1)))

(defrule regla26
    ?A<-(estudiante)
    (and(or(idiomas alto)(idiomas medio))(tipoCS c7))
=>
    (modify ?A (tipoEmpresa nacional-multinacional)(contrato parcial)(salario alto))
    (call ?*vector* addElement ?A)
    (assert (fin fin1)))

(defglobal ?*file* = ( new java.io.OutputStreamWriter ( new java.io.FileOutputStream "C://salida.txt" ) ) )
(defglobal ?*writer* = ( new java.io.BufferedWriter ?*file* ) )

(deffunction hola ()
(bind ?enumeration (call ?*vector* elements ) )
(while (call ?enumeration hasMoreElements ) do
( bind ?fact (call ?enumeration nextElement) )
(call ?*writer* write (call ?fact toString) )
(call ?*writer* newLine)
)
(call ?*writer* close))
;;(reset)
(dame_nombre)
(run)
(hola)
